package singletontest;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * 同步方法是对方法的整体加锁，这对运行效率来讲很不利的。改成同步代码块后：
 *
 * @author liuziyang
 * @create 2019-10-14 20:23
 */
public class SingletonTest4 {
    private static SingletonTest4
            myObject;

    public SingletonTest4
            () {

    }

    public static SingletonTest4
    getInstance() {
        try {
            synchronized (SingletonTest4
                    .class) {
                if (myObject == null) {
                    //模拟对象在创建之前做的一些准备工作
                    Thread.sleep(3000);
                    myObject = new SingletonTest4
                            ();
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return myObject;
    }

    /**
     * 运行结果虽然表明是正确的，但同步synchronized语句块依旧把整个 getInstance()方法代码包括在内，和synchronize 同步方法效率是一样低下。
     *
     * @param args
     */
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(SingletonTest4
                        .getInstance().hashCode());
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(SingletonTest4
                        .getInstance().hashCode());
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(SingletonTest4
                        .getInstance().hashCode());
            }
        }).start();
    }
}
